home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / util / gnu / xpdf-0.8-src.lha / xpdf-0.8-src / ltk / LTKButton.cc < prev    next >
C/C++ Source or Header  |  1998-11-28  |  4KB  |  156 lines

  1. //========================================================================
  2. //
  3. // LTKButton.cc
  4. //
  5. // Copyright 1996 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. #pragma implementation
  11. #endif
  12.  
  13. #include <stdlib.h>
  14. #include <stdarg.h>
  15. #include <stddef.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include "LTKWindow.h"
  19. #include "LTKButton.h"
  20. #include "LTKBorder.h"
  21.  
  22. LTKButton::LTKButton(char *name1, int widgetNum1, char *label1,
  23.              LTKButtonAction action1, LTKBoolValCbk pressCbk1):
  24.     LTKWidget(name1, widgetNum1) {
  25.   label = new GString(label1);
  26.   icon = None;
  27.   iconData = NULL;
  28.   action = action1;
  29.   on = gFalse;
  30.   pressCbk = pressCbk1;
  31. }
  32.  
  33. LTKButton::LTKButton(char *name1, int widgetNum1,
  34.              unsigned char *iconData1,
  35.              int iconWidth1, int iconHeight1,
  36.              LTKButtonAction action1, LTKBoolValCbk pressCbk1):
  37.     LTKWidget(name1, widgetNum1) {
  38.   label = NULL;
  39.   icon = None;
  40.   iconData = iconData1;
  41.   iconWidth = iconWidth1;
  42.   iconHeight = iconHeight1;
  43.   action = action1;
  44.   on = gFalse;
  45.   pressCbk = pressCbk1;
  46. }
  47.  
  48. LTKButton::~LTKButton() {
  49.   if (label)
  50.     delete label;
  51.   if (icon)
  52.     XFreePixmap(getDisplay(), icon);
  53. }
  54.  
  55. long LTKButton::getEventMask() {
  56.   return LTKWidget::getEventMask() | ButtonPressMask | ButtonReleaseMask;
  57. }
  58.  
  59. void LTKButton::layout1() {
  60.   XFontStruct *fontStruct;
  61.   XCharStruct extents;
  62.   int direction, ascent, descent;
  63.  
  64.   if (label) {
  65.     fontStruct = getXFontStruct();
  66.     XTextExtents(fontStruct, label->getCString(), label->getLength(),
  67.          &direction, &ascent, &descent, &extents);
  68.     textWidth = extents.width;
  69.     textHeight = fontStruct->ascent + fontStruct->descent;
  70.     textBase = fontStruct->ascent;
  71.     width = textWidth + 12 + 2 * ltkBorderWidth;
  72.     height = textHeight + 4 + 2 * ltkBorderWidth;
  73.   } else {
  74.     width = iconWidth + 12 + 2 * ltkBorderWidth;
  75.     height = iconHeight + 4 + 2 * ltkBorderWidth;
  76.   }
  77. }
  78.  
  79. void LTKButton::layout3() {
  80.   LTKWidget::layout3();
  81.   if (iconData && icon == None) {
  82.     icon = XCreatePixmapFromBitmapData(
  83.              getDisplay(), getXWindow(), (char *)iconData,
  84.              iconWidth, iconHeight, getFgColor(), getBgColor(),
  85.          DefaultDepth(getDisplay(), getScreenNum()));
  86.   }
  87. }
  88.  
  89. void LTKButton::redraw() {
  90.   int tx, ty;
  91.  
  92.   ltkDrawBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  93.         0, 0, width, height, on ? ltkBorderSunken : ltkBorderRaised);
  94.   if (label) {
  95.     tx = (width - textWidth) / 2;
  96.     ty = (height - textHeight) / 2 + textBase;
  97.     XDrawString(getDisplay(), xwin, getFgGC(), tx, ty,
  98.         label->getCString(), label->getLength());
  99.   } else {
  100.     XCopyArea(getDisplay(), icon, getXWindow(), getFgGC(),
  101.           0, 0, iconWidth, iconHeight,
  102.           (width - iconWidth) / 2, (height - iconHeight) / 2);
  103.   }
  104. }
  105.  
  106. void LTKButton::buttonPress(int mx, int my, int button, GBool dblClick) {
  107.   oldOn = on;
  108.   switch (action) {
  109.   case ltkButtonClick:
  110.     setState(gTrue);
  111.     break;
  112.   case ltkButtonSticky:
  113.     setState(gTrue);
  114.     break;
  115.   case ltkButtonToggle:
  116.     setState(!on);
  117.     break;
  118.   }
  119. }
  120.  
  121. void LTKButton::buttonRelease(int mx, int my, int button, GBool click) {
  122.   // mouse was released over button
  123.   if (mx >= 0 && mx < width && my >= 0 && my < height) {
  124.     switch (action) {
  125.     case ltkButtonClick:
  126.       setState(gFalse);
  127.       break;
  128.     case ltkButtonSticky:
  129.       break;
  130.     case ltkButtonToggle:
  131.       break;
  132.     }
  133.     if (pressCbk)
  134.       (*pressCbk)(this, widgetNum, on);
  135.  
  136.   // mouse was released outside button
  137.   } else {
  138.     setState(oldOn);
  139.   }
  140. }
  141.  
  142. //~ add a delay between press and release
  143. void LTKButton::activateDefault() {
  144.   buttonPress(0, 0, 1, gFalse);
  145.   XFlush(getDisplay());
  146.   buttonRelease(0, 0, 1, gTrue);
  147. }
  148.  
  149. void LTKButton::setState(GBool on1) {
  150.   if (on1 != on) {
  151.     on = on1;
  152.     ltkDrawBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  153.           0, 0, width, height, on ? ltkBorderSunken : ltkBorderRaised);
  154.   }
  155. }
  156.